package com.gxc.queue;

import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;

/**
 * 有一个特异性的双端队列，该队列可以从头部或尾部添加数据，但是只能从头部移出数据。
 *
 * 小A依次执行2n个指令往队列中添加数据和移出数据。其中n个指令是添加数据（可能从头部添加、也可能从尾部添加），依次添加1到n；n个指令是移出数据。
 *
 * 现在要求移除数据的顺序为1到n。
 *
 * 为了满足最后输出的要求，小A可以在任何时候调整队列中数据的顺序。
 *
 * 请问 小A 最少需要调整几次才能够满足移除数据的顺序正好是1到n。
 *
 * 输入描述
 * 第一行一个数据n，表示数据的范围。
 *
 * 接下来的2n行，其中有n行为添加数据，指令为：
 *
 * head add x表示从头部添加数据 x，
 * tail add x 表示从尾部添加数据x，
 * 另外 n 行为移出数据指令，指令为：remove 的形式，表示移出1个数据；
 *
 * 1 ≤ n ≤ 3 * 10^5。
 *
 * 所有的数据均合法。
 *
 * 输出描述
 * 一个整数，表示 小A 要调整的最小次数。
 */
public class MinSteps {

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        scanner.nextLine();

        Queue<Integer> queue = new LinkedList<>();
        int res = 0;
        boolean sort = true;
        for (int i = 0; i < n * 2; i++) {
            String str = scanner.nextLine();
            String[] split = str.split(" ");
            if (split[0].equals("head")) {
                //从头部添加元素,如果队列中有元素，则会打乱顺序
                if (!queue.isEmpty()) {
                    sort = false;
                }
                queue.add(Integer.parseInt(split[2]));
            } else if (split[0].equals("tail")) {
                queue.add(Integer.parseInt(split[2]));
            } else {
                if (queue.isEmpty()) continue;
                //不按顺序删除
                if (!sort) {
                    res++;
                    sort = true;
                }
                queue.remove();
            }
        }
        System.out.println(res);
    }
}
